package dht.communication;

import java.math.BigInteger;
import java.net.InetAddress;
import java.util.Random;

import dht.data.TabBigInteger;
import dht.message.AckMessage;
import dht.message.JoinMessage;
import dht.message.MajMessage;
import dht.message.MissMessage;
import dht.message.QuitMessage;
import dht.node.Node;

/**
 * Classe qui contient toutes les methode de creation de message.
 * @author bouceka
 *
 */
public class FabriqueMessage {
	
	/**
	 * Cree un JoinMessage
	 * @param source Source du message
	 * @param origine l'ip d'origine du join
	 * @return Retourne un JoinMessage avec comme un point aleatoire en destination.
	 */
	public static JoinMessage createJoinMessage(InetAddress source){

		TabBigInteger coord = new TabBigInteger(Node.NB_DIMENSION);
		
		for(int i=0; i<Node.NB_DIMENSION; i++){
			coord.setValue(i, new BigInteger(10,new Random()));
		}
		
		//vid est null
		return (new JoinMessage(source, null, coord));
	}
	
	/**
	 * Cree un JoinMessage
	 * @param source Source du message
	 * @param coord Point de destination
	 * @param origine L'ip d'origine de l'initiateur du join
	 * @return Retourne un JoinMessage avec coord comme destination
	 */
	public static JoinMessage createJoinMessage(InetAddress source, TabBigInteger coord){
		return (new JoinMessage(source, null,coord));
	}
	
	public static QuitMessage createQuitMessage(InetAddress source){
		return (new QuitMessage(source, null, null));
	}
	
	public static MissMessage createMissMessage(InetAddress source, InetAddress takeOverNode, String takeOverNodeVID){
		return (new MissMessage(source, null, null, takeOverNode,takeOverNodeVID));
	}
	
	public static AckMessage createAckMessage(InetAddress source){
		return (new AckMessage(source, null, null));
	}
	
	public static MajMessage createMajMessage(InetAddress source,String virtualId, int dim, String addrrAncienVoisin){
		return (new MajMessage(source, virtualId, null, dim, addrrAncienVoisin));
	}
}
